//题目:
// 设计你的循环队列实现。 循环队列是一种线性数据结构，其操作表现基于 FIFO（先进先出）原则并且队尾被连接在队首之后以形成一个循环。
// 它也被称为“环形缓冲器”。
// 循环队列的一个好处是我们可以利用这个队列之前用过的空间。
// 在一个普通队列里，一旦一个队列满了，我们就不能插入下一个元素，即使在队列前面仍有空间。
// 但是使用循环队列，我们能使用这些空间去存储新的值。
// 你的实现应该支持如下操作：
// MyCircularQueue(k): 构造器，设置队列长度为 k 。
// Front: 从队首获取元素。如果队列为空，返回 -1 。
// Rear: 获取队尾元素。如果队列为空，返回 -1 。
// enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
// deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
// isEmpty(): 检查循环队列是否为空。
// isFull(): 检查循环队列是否已满。
#include<iostream>
#include<vector>

using namespace std;
//代码:
class MyCircularQueue 
{
    vector<int> v;
    int head=0,tail=0;
public:
    MyCircularQueue(int k) 
    {
        v.resize(k+1);
    }
    
    bool enQueue(int value) 
    {
        //判断是否满了
        if(isFull())return false;
        v[head++]=value;
        head%=v.size();
        return true;
    }
    
    bool deQueue() 
    {
        //判断是否为空
        if(isEmpty())return false;
        tail++;
        tail%=v.size();
        return true;
    }
    
    int Front() 
    {
        //判断是否为空
        if(isEmpty())return -1;
        return v[tail];
    }
    
    int Rear() 
    {
        if(isEmpty())return -1;
        if(head==0)return v[v.size()-1];
        return v[head-1];
    }
    
    bool isEmpty() 
    {
        return tail==head;
    }
    
    bool isFull()
    {
        return (head+1)%v.size()==tail;
    }
};